/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.capex.javaee.applets;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.RandomAccessFile;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author IK
 */
public class MenuItem extends JApplet implements ActionListener {

    /**
     * Initialization method that will be called after the applet is loaded into
     * the browser.
     */
    private JMenuBar barraMenu = new JMenuBar();
    private JMenu menuConOpcionesFile = new JMenu("File");
    private JMenu menuConOpcionesEdit = new JMenu("Edit");
    private JMenu menuConOpcionesInsert = new JMenu("Insert");
    private JMenuItem opcionNuevoArchivo = new JMenuItem("new File");
    private JMenuItem opcionCut = new JMenuItem("Cut");
    private JMenuItem opcionCopy = new JMenuItem("Copy");
    private JMenuItem opcionPaste = new JMenuItem("Paste");
    private JMenuItem opcionUpload = new JMenuItem("Upload Image");
    private JMenuItem opcionClose = new JMenuItem("Close");
    private File temporal;
    private boolean isCut;
    private JLabel etiqueta = new JLabel();

    @Override
    public void init() {
        // TODO start asynchronous download of heavy resources        
        menuConOpcionesFile.add(opcionNuevoArchivo);
        menuConOpcionesFile.add(opcionClose);

        menuConOpcionesEdit.add(opcionCut);
        menuConOpcionesEdit.add(opcionCopy);
        menuConOpcionesEdit.add(opcionPaste);

        menuConOpcionesInsert.add(opcionUpload);

        barraMenu.add(menuConOpcionesFile);
        barraMenu.add(menuConOpcionesEdit);
        barraMenu.add(menuConOpcionesInsert);

        setJMenuBar(barraMenu);

        opcionNuevoArchivo.addActionListener(this);
        opcionCut.addActionListener(this);
        opcionCopy.addActionListener(this);
        opcionPaste.addActionListener(this);
        opcionUpload.addActionListener(this);
        opcionClose.addActionListener(this);
        add(etiqueta);
    }
    // TODO overwrite start(), stop() and destroy() methods

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();

        if (source.equals(opcionNuevoArchivo)) {
            createFile();
        } else if (source.equals(opcionClose)) {
            System.exit(0);
        } else if (source.equals(opcionCut)) {
            loadFileIntoMemory();
            isCut = true;
        } else if (source.equals(opcionPaste)) {
            pasteFileFromMemory();
        } else if (source.equals(opcionCopy)) {
            loadFileIntoMemory();
        } else if (source.equals(opcionUpload)) {
            loadImageIntoPanel();
        }

    }

    private void createFile() {
        JFileChooser selectorDeArchivos = new JFileChooser(".");
        int showSaveDialog = selectorDeArchivos.showSaveDialog(this);

        if (showSaveDialog == JFileChooser.APPROVE_OPTION) {
            try {
                RandomAccessFile nuevoArchivo = new RandomAccessFile(selectorDeArchivos.getSelectedFile(), "rw");
                nuevoArchivo.close();
            } catch (Exception ex) {
                Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private void loadFileIntoMemory() {
        JFileChooser selectorDeArchivos = new JFileChooser(".");
        selectorDeArchivos.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int showOpenDialog = selectorDeArchivos.showOpenDialog(this);


        if (showOpenDialog == JFileChooser.APPROVE_OPTION) {
            if (selectorDeArchivos.getSelectedFile() != null) {
                temporal = selectorDeArchivos.getSelectedFile();
                System.out.println(temporal.getAbsolutePath());

            }
        }
    }

    private void loadImageIntoMemory() {
        JFileChooser selectorDeArchivos = new JFileChooser(".");
        selectorDeArchivos.setFileSelectionMode(JFileChooser.FILES_ONLY);
        selectorDeArchivos.setFileFilter(new FileNameExtensionFilter("JPG Images Only", "JPG"));
        int showOpenDialog = selectorDeArchivos.showOpenDialog(this);


        if (showOpenDialog == JFileChooser.APPROVE_OPTION) {
            if (selectorDeArchivos.getSelectedFile() != null) {
                File imagenTemporal = selectorDeArchivos.getSelectedFile();
                String carpetaDestinoString = System.getProperty("user.home") + "\\Upload";

                File carpetaDestino = new File(carpetaDestinoString);
                if (!carpetaDestino.exists()) {
                    carpetaDestino.mkdir();
                }
                try {
                    RandomAccessFile archivoOrigen = new RandomAccessFile(imagenTemporal, "r");
                    RandomAccessFile archivoDestino = new RandomAccessFile(carpetaDestinoString + "\\" + imagenTemporal.getName(), "rw");
                    System.out.println(carpetaDestinoString + "\\" + imagenTemporal.getName());
                    int bit;
                    while ((bit = archivoOrigen.read()) >= 0) {
                        archivoDestino.writeByte(bit);
                    }

                    archivoOrigen.close();
                    archivoDestino.close();
                } catch (Exception ex) {
                }

            }
        }
    }

    private void loadImageIntoPanel() {
        JFileChooser selectorDeArchivos = new JFileChooser(".");
        selectorDeArchivos.setFileSelectionMode(JFileChooser.FILES_ONLY);
        selectorDeArchivos.setFileFilter(new FileNameExtensionFilter("JPG Images Only", "JPG"));
        int showOpenDialog = selectorDeArchivos.showOpenDialog(this);


        if (showOpenDialog == JFileChooser.APPROVE_OPTION) {
            if (selectorDeArchivos.getSelectedFile() != null) {
                File imagenTemporal = selectorDeArchivos.getSelectedFile();
                ImageIcon imagen = new ImageIcon(imagenTemporal.getAbsolutePath());
                etiqueta.setIcon(imagen);
                etiqueta.setBounds(0, 0, 300, 300);

            }
        }
    }

    private void pasteFileFromMemory() {
        JFileChooser selectorDeArchivos = new JFileChooser(".");
        selectorDeArchivos.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int showOpenDialog = selectorDeArchivos.showOpenDialog(this);


        if (showOpenDialog == JFileChooser.APPROVE_OPTION) {
            if (temporal != null) {
                try {
                    RandomAccessFile archivoOrigen = new RandomAccessFile(temporal, "r");

                    String fileName = temporal.getName();
//                    String directoryToPaste = selectorDeArchivos.getCurrentDirectory().getAbsolutePath() + "\\" + fileName;
//                    
//                    File confirmDirectory = new File(directoryToPaste);
//                    
//                    if(confirmDirectory.exists()){
//                        fileName = fileName.split("."). + new Random().nextLong();
//                    }

                    RandomAccessFile archivoDestino = new RandomAccessFile(selectorDeArchivos.getCurrentDirectory().getAbsolutePath() + "\\" + fileName, "rw");
                    System.out.println(selectorDeArchivos.getSelectedFile().getAbsolutePath() + "\\" + temporal.getName());
                    int bit;
                    while ((bit = archivoOrigen.read()) >= 0) {
                        archivoDestino.writeByte(bit);
                    }

                    archivoOrigen.close();
                    archivoDestino.close();

                    if (isCut) {
                        temporal.delete();
                        isCut = false;
                    } else {
                    }


                } catch (Exception ex) {
                    Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}
